package com.anivia.common.web.config.log;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.anivia.common.core.constant.CommonStant;
import com.anivia.common.web.satoken.util.UserInfoUtil;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 日志过滤器
 *
 * @author wangj
 */
@Slf4j
@Component
public class WebLogFilter implements Filter, Ordered {
    /**
     * 针对每个过滤器请求，执行以下操作：
     * 1. 获取请求头中的链路追踪ID，如果不存在则生成新的链路追踪ID
     * 2. 将链路追踪ID放入MDC
     * 3. 判断是否存在登录用户，如果存在将登录用户类型和登录ID放入MDC
     * 4. 执行过滤器链
     *
     * @param request     请求对象
     * @param response    响应对象
     * @param filterChain 过滤器链
     * @throws IOException      如果发生I/O错误
     * @throws ServletException 如果出现Servlet异常
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        // 获取链路追踪ID，如果不存在则生成新的ID
        String traceId = ((HttpServletRequest) request).getHeader(CommonStant.TRACE_ID);
        if (StrUtil.isBlank(traceId)) {
            traceId = IdUtil.fastSimpleUUID();
        }
        // 将链路追踪ID放入MDC
        MDC.put(CommonStant.TRACE_ID, traceId);
        if (UserInfoUtil.isLogin()) {
            MDC.put(CommonStant.LOGIN_TYPE, UserInfoUtil.getLoginType().name());
            MDC.put(CommonStant.LOGIN_ID, UserInfoUtil.getLoginUserId() + "");
        }
        filterChain.doFilter(request, response);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}
